openpyxl 设置活动 Sheet

openpyxl Set Active Sheet

http://openpyxl.readthedocs.io/en/default/_modules/openpyxl/workbook/workbook.html?highlight=set%20active%20sheet

文档显示工作簿 object 有一个 active 属性

@property
def active(self):
    """Get the currently active sheet"""
    return self._sheets[self._active_sheet_index]

@active.setter
def active(self, value):
    """Set the active sheet"""
    self._active_sheet_index = value

如果wb = openpyxl.Workbook()调用wb.active给出默认第一个作品的标题sheet即Sheet。 假设我创建了另一个 sheet ws1 = wb.create_sheet('another sheet'),我如何 "set" 将其设为活动 sheet?

文档显示有一个活动 "setter" 也称为活动。它需要一个额外的参数,一个整数索引值。

为什么wb.active(1)不起作用?我不是用

调用函数吗

我不熟悉整个 getter 和 setter 的事情。但是,我想出了答案。现在我非常困惑为什么它会这样工作——因为它看起来不像典型的函数调用。无论如何,要使用 "setter" 你会写

wb.active = 1

which uh "eats" 1 =) 并更改活动 sheet。只是想着至少还有一个人可能会问类似的问题。

更新: openpyxl 已更新以允许直接设置活动 sheet:

wb.active = wb['sheet_name']

在演示中使用以下内容:

# Set Active Sheet
wb.active = wb['charlie']

带有演示的原始过时答案更改为保存工作簿,允许验证任何选定的过程:

这是另一种通过 sheetname 在工作簿中设置活动 sheet 的方法。有类似的答案(openpyxl get sheet by name 例如涉及打开一个关闭的文件)和其他人没有足够的细节让我理解这个功能。

Manipulating a workbook in memory 教程是开始的地方,在我使用本教程演示的答案下没有活动的 sheet 名称,它实际上是 sheet活跃指数。如果添加或删除 sheet 会更改索引位置的 sheet,则不同的 sheet 将变为活动状态。

最初我认为 .create_sheet 使 sheet 处于活动状态,但后来我意识到我只是在活动 sheet 索引处创建了 sheet,而该索引恰好为 0。索引可以设置为大于 sheet 数量的值,并且文档还包含一条注释“如果 sheet 设置为活动被隐藏 return 下一个可见 sheet 或 None".

冗长的简短回答

for i, s in enumerate(wb.sheetnames):
    if s == 'charlie':
        break
wb.active = i

随时改进此答案。

演示

C:\Users\User\Documents>py
Python 3.10.2 (tags/v3.10.2:a58ebcc, Jan 17 2022, 14:12:15) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> # http://openpyxl.readthedocs.io/en/2.5/tutorial.html#create-a-workbook
>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> print(wb.sheetnames)
['Sheet']
>>>
>>> print(wb.active)
<Worksheet "Sheet">
>>> ws = wb.active
>>> ws.title = "alpha"
>>>
>>> ws = wb.create_sheet('bravo')
>>> print(wb.sheetnames)
['alpha', 'bravo']
>>> print(wb.active)
<Worksheet "alpha">
>>>
>>> ws = wb.create_sheet('charlie',0)  # insert at index 0
>>> print(wb.sheetnames)
['charlie', 'alpha', 'bravo']
>>> print(wb.active)
<Worksheet "charlie">
>>>
>>>
>>> wb.active = 1
>>> print(wb.active)
<Worksheet "alpha">
>>>
>>> wb.active = 2
>>> print(wb.active)
<Worksheet "bravo">
>>>
>>> wb.active = 0
>>> print(wb.active)
<Worksheet "charlie">
>>>
>>> wb.active = 3
>>> print(wb.active)
None
>>>
>>> ws = wb.create_sheet(index=0)  # insert at index
>>> print(wb.active)
<Worksheet "bravo">
>>> print(wb.sheetnames)
['Sheet', 'charlie', 'alpha', 'bravo']
>>>
>>>
>>> ws_active = wb.get_sheet_by_name('charlie')
<stdin>:1: DeprecationWarning: Call to deprecated function get_sheet_by_name (Use wb[sheetname]).
>>> ws_active = wb['charlie']
>>> print(wb.active)
<Worksheet "bravo">
>>> ws4 = wb["charlie"] # from 
>>> print(wb.active)
<Worksheet "bravo">
>>>
>>> # Set Active Sheet
>>> for i, s in enumerate(wb.sheetnames):
...     if s == 'charlie':
...         break
...
>>> wb.active = i
>>>
>>> # Confirm Active Sheet
>>> print(wb.active)
<Worksheet "charlie">
>>>
>>> # Open workbook to verify
>>> wb.save("Demo.xlsx")
>>>

作为参考,另一种有用的方法 - 特别是当您想通过名称调用 sheet 时:

wb = openpyxl.load_workbook(path/to/your/spreadsheet)
worksheet_names = wb.sheetnames # this variable is presented as a list, so we can manipulate it accordingly, but finding the index number using the name.
sheet_index = worksheet_names.index(<name of your target sheet>) # this will return the index number where your worksheet resides.  It should be mentioned that this sheet name must exist in the worksheet_names list variable
wb.active = sheet_index # this will activate the worksheet by index

您现在应该在您选择的 sheet 中工作,但这样做的好处是您可以按名称而不是按号码呼叫 sheet。这一点是我提供此附加答案的原因。

如果知道tab的名字,可以写一行:

book.active = book.sheetnames.index('YourSheetName')

sheets = wb.get_sheet_names()
for i in sheets:
    if i == 'xyz':
        wb.active = i
        break

或者你可以简单地做

xyz_sheet = wb.get_sheet_by_name('xyz')
wb.active = xyz_sheet

工作簿(即 wb)的 xyz sheet 现在处于活动状态

这是按名称设置活动工作表的最简单方法:

active_sheet = wb['sheet name']